package com.marketing.tenant.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.marketing.tenant.entity.TenantUsage;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.time.LocalDate;
import java.util.List;

/**
 * 租户使用统计Mapper接口
 */
@Mapper
public interface TenantUsageMapper extends BaseMapper<TenantUsage> {

    /**
     * 根据租户ID和日期获取使用统计
     * @param tenantId 租户ID
     * @param statDate 统计日期
     * @return 使用统计
     */
    TenantUsage selectByTenantIdAndDate(@Param("tenantId") Long tenantId, 
                                        @Param("statDate") LocalDate statDate);

    /**
     * 根据租户ID获取指定时间范围的使用统计
     * @param tenantId 租户ID
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 使用统计列表
     */
    List<TenantUsage> selectByTenantIdAndDateRange(@Param("tenantId") Long tenantId,
                                                   @Param("startDate") LocalDate startDate,
                                                   @Param("endDate") LocalDate endDate);

    /**
     * 获取租户最近N天的使用统计
     * @param tenantId 租户ID
     * @param days 天数
     * @return 使用统计列表
     */
    List<TenantUsage> selectRecentByTenantId(@Param("tenantId") Long tenantId, 
                                             @Param("days") Integer days);

    /**
     * 获取所有租户在指定日期的使用统计
     * @param statDate 统计日期
     * @return 使用统计列表
     */
    List<TenantUsage> selectByStatDate(@Param("statDate") LocalDate statDate);

    /**
     * 增加API调用次数
     * @param tenantId 租户ID
     * @param statDate 统计日期
     * @param count 增加的次数
     * @return 影响行数
     */
    int incrementApiCalls(@Param("tenantId") Long tenantId, 
                          @Param("statDate") LocalDate statDate, 
                          @Param("count") Long count);

    /**
     * 增加登录次数
     * @param tenantId 租户ID
     * @param statDate 统计日期
     * @param count 增加的次数
     * @return 影响行数
     */
    int incrementLoginCount(@Param("tenantId") Long tenantId, 
                            @Param("statDate") LocalDate statDate, 
                            @Param("count") Integer count);

    /**
     * 更新存储使用量
     * @param tenantId 租户ID
     * @param statDate 统计日期
     * @param storageUsed 存储使用量（字节）
     * @return 影响行数
     */
    int updateStorageUsed(@Param("tenantId") Long tenantId, 
                          @Param("statDate") LocalDate statDate, 
                          @Param("storageUsed") Long storageUsed);

    /**
     * 更新用户数量和活跃用户数
     * @param tenantId 租户ID
     * @param statDate 统计日期
     * @param userCount 用户总数
     * @param activeUserCount 活跃用户数
     * @return 影响行数
     */
    int updateUserCount(@Param("tenantId") Long tenantId, 
                        @Param("statDate") LocalDate statDate, 
                        @Param("userCount") Integer userCount, 
                        @Param("activeUserCount") Integer activeUserCount);
}